#ifndef INFOPRINT_H
#define INFOPRINT_H

#include <QWidget>
#include <QTextEdit>
#include <QColor>
#include <QDateTime>
#include <QFile>
#include <QTextStream>

enum class Log_Level {
    Trace = 0,
    Debug,
    Info,     // 信息
    Warning,  // 警告
    Error,     // 错误
    Fatal
};

class InfoPrint : public QWidget
{
    friend void TraceLogPrint(const QString& message);
    friend void DebugLogPrint(const QString& message);
    friend void InfoLogPrint(const QString& message);
    friend void WarningLogPrint(const QString& message);
    friend void ErrorLogPrint(const QString& message);
    friend void FatalLogPrint(const QString& message);
    Q_OBJECT
public:
    static InfoPrint* instance(QWidget *parent = nullptr);

    // 新增公共方法，方便直接调用
    void trace(const QString& message);
    void debug(const QString& message);
    void info(const QString& message);
    void warning(const QString& message);
    void error(const QString& message);
    void fatal(const QString& message);
    
    // 清空日志窗口
    void clear();
    
    // 保存日志到文件
    bool saveToFile(const QString& filePath);
    
    // 导出指定级别及以上的日志
    bool exportLogs(const QString& filePath, Log_Level minLevel = Log_Level::Info);
    
    // 设置是否自动滚动到最新日志
    void setAutoScroll(bool autoScroll);
    
    // 设置最大日志行数
    void setMaxLogLines(int maxLines);
    
    // 获取日志记录的总数
    int getLogCount() const;
    
    // 按日志级别过滤显示
    void filterByLevel(Log_Level minLevel);

signals:
    // 添加信号
    void logAdded(const QString& message, Log_Level level);
    
    // 日志导出完成信号
    void logExportFinished(bool success, const QString& filePath);

public:
    void setFixedSize(const QSize &size);
    void setFixedSize(const int& width,const int& height);
private:
    explicit InfoPrint(QWidget *parent = nullptr);
    virtual ~InfoPrint();
    void addLogMessage(const QString& message, Log_Level level);
    void InitInfoPrint();
    QString getCurrentTime();
    
    // 格式化日志消息，包含时间戳和级别
    QString formatLogMessage(const QString& message, Log_Level level);
    
    // 获取日志级别对应的文本
    QString logLevelToString(Log_Level level);
    
    // 私有成员变量
    bool m_autoScroll;
    int m_maxLogLines;
    
    // 存储所有日志消息及其级别
    struct LogEntry {
        QString message;
        Log_Level level;
        QDateTime timestamp;
    };
    QList<LogEntry> m_logEntries;
    
private:
    QColor colorTrace;
    QColor colorDebug;
    QColor colorInfo;     // 信息
    QColor colorWarning;  // 警告
    QColor colorError;     // 错误
    QColor colorFatal;
    QTextEdit  *m_infoPrint;
};
void TraceLogPrint(const QString& message);
void DebugLogPrint(const QString& message);
void InfoLogPrint(const QString& message);
void WarningLogPrint(const QString& message);
void ErrorLogPrint(const QString& message);
void FatalLogPrint(const QString& message);
#endif // INFOPRINT_H
